package net.atos.java.example.boodschappen.client;

import net.atos.java.example.boodschappen.shared.BoodschappenService;
import net.atos.java.example.boodschappen.shared.BoodschappenServiceAsync;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * The begin punt van de applicatie voor GWT.
 * @author Pal Hargitai
 */
public class BoodschappenApplicatie implements EntryPoint {

	/** De boodschappen service. */
	private BoodschappenServiceAsync boodschappenService = GWT.create(BoodschappenService.class);
	/** Het hoofd panel. */
	private BoodschappenPanel boodschappenPanel;

	/**
	 * Start bij het laden van de module.
	 */
	public void onModuleLoad() {
		// Maak een nieuw panel aan.
		boodschappenPanel = new BoodschappenPanel();
		RootPanel.get("boodschappenLijst").add(boodschappenPanel);
		// Mail knop.
		final Button mailKnop = new Button("Mail boodschappen");
		mailKnop.addClickHandler(new MailBoodschappenHandler());
		RootPanel.get("knoppenLijst").add(mailKnop);
		// Extra boodschap knop.
		final Button nieuwKnop = new Button("Extra boodschap...");
		nieuwKnop.addClickHandler(new NieuweBoodschappenHandler());
		RootPanel.get("knoppenLijst").add(nieuwKnop);
	}

	/**
	 * Knop voor het mailen.
	 * 
	 * @author Pal Hargitai
	 */
	public class MailBoodschappenHandler implements ClickHandler {
		/** {@inheritDoc} */
		@Override
		public void onClick(ClickEvent event) {
			boodschappenService.mailBoodschappenlijst(new GemailedAlertCallback());
		}
	}

	/**
	 * Gemailed terug koppeling.
	 * 
	 * @author Pal Hargitai
	 */
	public class GemailedAlertCallback implements AsyncCallback<Void> {
		/** {@inheritDoc} */
		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());
		}
	
		/** {@inheritDoc} */
		@Override
		public void onSuccess(Void result) {
			Window.alert("Gemailed!");
		}
	}

	/**
	 * Knop voor het toevoegen paneel.
	 * 
	 * @author Pal Hargitai
	 */
	public class NieuweBoodschappenHandler implements ClickHandler {
		/** {@inheritDoc} */
		@Override
		public void onClick(ClickEvent event) {
			NieuweBoodschappenPanel panel = new NieuweBoodschappenPanel(boodschappenPanel.createOphalenCallback());
			panel.setPopupPositionAndShow(new EenDerdePositie(panel));
		}
	}

	/**
	 * Callback voor de positie van het panel.
	 * 
	 * @author Pal Hargitai
	 */
	public class EenDerdePositie implements PositionCallback {
		/** De popup. */
		private PopupPanel widget;
	
		/**
		 * Maakt de callback voor het hervergroten van de gegeven widget.
		 * @param widget De te aan te passen widget.
		 */
		public EenDerdePositie(PopupPanel widget) {
			this.widget = widget;
		}

		/** {@inheritDoc} */
		@Override
		public void setPosition(int offsetWidth, int offsetHeight) {
            int left = (Window.getClientWidth() - offsetWidth) / 3;
            int top = (Window.getClientHeight() - offsetHeight) / 3;
            widget.setPopupPosition(left, top);
            widget.setWidth("33%");
		}
	}
}
